package marionito.usecasesimpl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Lock;
import javax.ejb.LockType;
import javax.ejb.Stateless;

import marionito.dao.CaseDao;
import marionito.dao.JoueurPartieDao;
import marionito.dao.PartieDao;
import marionito.domaine.Case;
import marionito.domaine.Joueur;
import marionito.domaine.JoueurPartie;
import marionito.domaine.Partie;
import marionito.usecases.GestionJoueurPartie;

@Stateless
public class GestionJoueurPartieImpl implements GestionJoueurPartie {

	@EJB
	private CaseDao caseDao;

	@EJB
	private JoueurPartieDao joueurPartieDao;

	@EJB
	private PartieDao partieDao;

	@Override
	@Lock(LockType.READ)
	public List<Case> listerCases(Joueur joueur) {
		return this.caseDao.lister(joueur);
	}

	@Override
	public List<Integer> getCasesPossibles(String nomPartie, Joueur joueur,
			int valeurDe) {
		Partie partie = partieDao.rechercherPartie(nomPartie);
		if (partie == null)
			return null;
		List<Integer> liste = new ArrayList<Integer>();
		int deA = 0;
		int deB = 0;
		if (valeurDe > 2 && valeurDe < 19) {
			deA = valeurDe * 2 - 3;
			deB = valeurDe * 2 - 2;
		} else {
			deA = valeurDe;
			deB = valeurDe;
		}

		Case caseA = caseDao.rechercherCaseLibre(joueur, partie, deA);
		Case caseB = caseDao.rechercherCaseLibre(joueur, partie, deB);

		if (caseA != null || caseB != null) {
			if (deA == deB) {
				liste.add(caseA.getNum());
				return liste;
			}

			if (caseA != null)
				liste.add(caseA.getNum());
			if (caseB != null)
				liste.add(caseB.getNum());
			return liste;
		}

		deA--;
		while (caseA == null && deA != 0) {
			caseA = caseDao.rechercherCaseLibre(joueur, partie, deA);
			deA--;
		}

		deB++;
		while (caseB == null && deB != 21) {
			caseB = caseDao.rechercherCaseLibre(joueur, partie, deB);
			deB++;
		}

		if (caseA != null)
			liste.add(caseA.getNum());

		if (caseB != null)
			liste.add(caseB.getNum());
		return liste;

	}

	@Override
	public JoueurPartie chargerTout(JoueurPartie joueurPartie) {
		joueurPartie = this.joueurPartieDao.chargerCases(joueurPartie);
		return joueurPartie;
	}

}
